package main

//
//import (
//	"bytes"
//	"encoding/base64"
//	"fmt"
//	"github.com/gin-gonic/gin"
//	"io"
//	"mime/multipart"
//	"net"
//	"net/http"
//	"sync"
//	"time"
//	"tuchuang/util"
//)
//
//const (
//	curIp        = "192.168.2.176"
//	curPort      = "8080"
//	databaseIp   = ""
//	databasePort = "8081"
//)
//
//func main() {
//	gin.SetMode(gin.ReleaseMode)
//	r := gin.Default()
//	r.LoadHTMLGlob("./web/*")
//
//	ConnPoolSet := util.NewConnPool(100, func() (net.Conn, error) {
//		return net.Dial("tcp", fmt.Sprintf("%s:%s", databaseIp, databasePort))
//	})
//	defer ConnPoolSet.Close()
//
//	ConnPoolGet := util.NewConnPool(100, func() (net.Conn, error) {
//		return net.Dial("tcp", fmt.Sprintf("%s:%s", databaseIp, databasePort))
//	})
//	defer ConnPoolGet.Close()
//
//	ConnPoolDel := util.NewConnPool(100, func() (net.Conn, error) {
//		return net.Dial("tcp", fmt.Sprintf("%s:%s", databaseIp, databasePort))
//	})
//	defer ConnPoolDel.Close()
//
//	r.GET("/", func(c *gin.Context) {
//		c.HTML(http.StatusOK, "index.html", gin.H{})
//	})
//	r.POST("/upload", func(c *gin.Context) {
//		form, err := c.MultipartForm()
//		if err != nil {
//			c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
//			return
//		}
//		var keys []string
//		var mu sync.Mutex
//		var wg sync.WaitGroup
//		files := form.File["image"]
//
//		for _, file := range files {
//			wg.Add(1)
//			go func(file *multipart.FileHeader) {
//				dialSET, _ := ConnPoolSet.Get()
//				defer ConnPoolSet.Put(dialSET)
//				defer wg.Done()
//				src, _ := file.Open()
//				defer src.Close()
//				data, _ := io.ReadAll(src)
//				key := util.MD5(data)
//				base64Data := base64.StdEncoding.EncodeToString(data)
//				_, err = dialSET.Write([]byte(fmt.Sprintf("set %s %s;", key, base64Data)))
//				if err != nil {
//					//c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to send data to TCP server"})
//					c.HTML(http.StatusNotFound, "404.html", gin.H{"error": "Failed to send data to TCP server"})
//					return
//				}
//				mu.Lock()
//				keys = append(keys, fmt.Sprintf("http://%s:%s/image/%s", curIp, curPort, key))
//				mu.Unlock()
//				time.Sleep(1 * time.Second)
//			}(file)
//		}
//		wg.Wait()
//		c.JSON(http.StatusOK, gin.H{"message": "ok", "keys": keys})
//	})
//	r.GET("/image/:key", func(c *gin.Context) {
//		//dialGET, _ := net.Dial("tcp", fmt.Sprintf("%s:%s", databaseIp, databasePort))
//		//defer dialGET.Close()
//
//		dialGET, _ := ConnPoolGet.Get()
//		defer ConnPoolGet.Put(dialGET)
//
//		buffer := bytes.NewBuffer(nil)
//		key := c.Param("key")
//		_, err := dialGET.Write([]byte(fmt.Sprintf("get %s;", key)))
//		if err != nil {
//			//c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to send request to TCP server"})
//			c.HTML(http.StatusNotFound, "404.html", gin.H{"error": "Failed to send request to TCP server"})
//			return
//		}
//
//		for {
//			chunk := make([]byte, 4096)
//			n, err := dialGET.Read(chunk)
//			if err != nil {
//				c.HTML(http.StatusNotFound, "404.html", gin.H{"error": "Failed to read data to TCP server"})
//				return
//			}
//
//			buffer.Write(chunk[:n])
//			if string(chunk[n-1]) == ";" {
//				break
//			}
//		}
//		Data := buffer.String()
//		Data = Data[:len(Data)-1]
//		switch Data {
//		case "NotFind":
//			c.HTML(http.StatusNotFound, "404.html", gin.H{})
//			return
//		}
//		imageData, _ := base64.StdEncoding.DecodeString(Data)
//
//		c.Header("Content-Type", "image/png")
//		c.Writer.Write(imageData)
//	})
//	r.DELETE("/image/:key", func(c *gin.Context) {
//		dialDEL, _ := ConnPoolDel.Get()
//		defer ConnPoolDel.Put(dialDEL)
//
//		key := c.Param("key")
//
//		_, err := dialDEL.Write([]byte(fmt.Sprintf("del %s;", key)))
//		if err != nil {
//			//c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to send request to TCP server"})
//			c.HTML(http.StatusNotFound, "404.html", gin.H{"error": "Failed to send request to TCP server"})
//			return
//		}
//	})
//
//	r.Run(fmt.Sprintf("%s:%s", curIp, curPort))
//}
